<?php
/*
 * Copyright 2007 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * Create a Direcotry Map
 *
 * Reads the specified directory and builds an array
 * representation of it.  Sub-folders contained with the
 * directory will be mapped as well.
 *
 * @access	public
 * @param	string	path to source
 * @param	bool	whether to limit the result to the top level only
 * @return	array
 */
function directory_map($source_dir, $top_level_only = FALSE) {
	if (!isset ($filedata))
		$filedata = array ();

	if ($fp = @ opendir($source_dir)) {
		while (FALSE !== ($file = readdir($fp))) {
			if (@ is_dir($source_dir . $file) && substr($file, 0, 1) != '.' AND $top_level_only == FALSE) {
				$temp_array = array ();

				$temp_array = directory_map($source_dir . $file . "/");

				$filedata[$file] = $temp_array;
			}
			elseif (substr($file, 0, 1) != ".") {
				$filedata[] = $file;
			}
		}
		return $filedata;
	}
}

function clear_directory($path) {
	if ($dir_handle = opendir($path)) {
		while ($file = readdir($dir_handle)) {
			if ($file == "." || $file == "..") {
				if (!@ unlink($path . "/" . $file)) {
					continue;
				}
			} else {
				@ unlink($path . "/" . $file);
			}
		}
		closedir($dir_handle);
		return true;
	} else {
		return false;
	}
}

function force_remove_directory($path) {
	if (clear_directory($path)) {
		if (rmdir($path)) {
			return true;
		} else {
			return false;
		}
	} else {
		return false;
	}
}


/**
 * Read File
 *
 * Opens the file specfied in the path and returns it as a string.
 *
 * @access	public
 * @param	string	path to file
 * @return	string
 */
function read_file($file)
{
	if ( ! file_exists($file))
	{
		return FALSE;
	}

	if (function_exists('file_get_contents'))
	{
		return file_get_contents($file);
	}

	if ( ! $fp = @fopen($file, 'rb'))
	{
		return FALSE;
	}

	flock($fp, LOCK_SH);

	$data = '';
	if (filesize($file) > 0)
	{
		$data =& fread($fp, filesize($file));
	}

	flock($fp, LOCK_UN);
	fclose($fp);

	return $data;
}

// ------------------------------------------------------------------------

/**
 * Write File
 *
 * Writes data to the file specified in the path.
 * Creates a new file if non-existent.
 *
 * @access	public
 * @param	string	path to file
 * @param	string	file data
 * @return	bool
 */
function write_file($path, $data, $mode = 'wb')
{
	if ( ! $fp = @fopen($path, $mode))
	{
		return FALSE;
	}

	flock($fp, LOCK_EX);
	fwrite($fp, $data);
	flock($fp, LOCK_UN);
	fclose($fp);

	return TRUE;
}

// ------------------------------------------------------------------------

/**
 * Delete Files
 *
 * Deletes all files contained in the supplied directory path.
 * Files must be writable or owned by the system in order to be deleted.
 * If the second parameter is set to TRUE, any directories contained
 * within the supplied base directory will be nuked as well.
 *
 * @access	public
 * @param	string	path to file
 * @param	bool	whether to delete any directories found in the path
 * @return	bool
 */
function delete_files($path, $del_dir = FALSE, $level = 0)
{
	// Trim the trailing slash
	$path = preg_replace("|^(.+?)/*$|", "\\1", $path);

	if ( ! $current_dir = @opendir($path))
		return;

	while(FALSE !== ($filename = @readdir($current_dir)))
	{
		if ($filename != "." and $filename != "..")
		{
			if (is_dir($path.'/'.$filename))
			{
				$level++;
				delete_files($path.'/'.$filename, $del_dir, $level);
			}
			else
			{
				unlink($path.'/'.$filename);
			}
		}
	}
	@closedir($current_dir);

	if ($del_dir == TRUE AND $level > 0)
	{
		@rmdir($path);
	}
}

// ------------------------------------------------------------------------

/**
 * Get Filenames
 *
 * Reads the specified directory and builds an array containing the filenames.
 * Any sub-folders contained within the specified path are read as well.
 *
 * @access	public
 * @param	string	path to source
 * @param	bool	whether to include the path as part of the filename
 * @return	array
 */
function get_filenames($source_dir, $include_path = FALSE)
{
	static $_filedata = array();

	if ($fp = @opendir($source_dir))
	{
		while (FALSE !== ($file = readdir($fp)))
		{
			if (@is_dir($source_dir.$file) && substr($file, 0, 1) != '.')
			{
				 get_filenames($source_dir.$file."/", $include_path);
			}
			elseif (substr($file, 0, 1) != ".")
			{

				$_filedata[] = ($include_path == TRUE) ? $source_dir.$file : $file;
			}
		}
		return $_filedata;
	}
}

function human_filesize( $bytes, $decimal = '1' ) {
   if( is_numeric( $bytes ) ) {
	 $position = 0;
	 $units = array( " Bytes", " KB", " MB", " GB", " TB" );
	 while( $bytes >= 1024 && ( $bytes / 1024 ) >= 1 ) {
		 $bytes /= 1024;
		 $position++;
	 }
	 return round( $bytes, $decimal ) . $units[$position];
   }
   else {
	 return "0 Bytes";
   }
}


function readfile_chunked($filename,$retbytes=true) {
   $chunksize = 1*(1024*1024); // how many bytes per chunk
   $buffer = '';
   $cnt =0;
   // $handle = fopen($filename, 'rb');
   $handle = fopen($filename, 'rb');
   if ($handle === false) {
       return false;
   }
   while (!feof($handle)) {
       $buffer = fread($handle, $chunksize);
       echo $buffer;
       ob_flush();
       flush();
       if ($retbytes) {
           $cnt += strlen($buffer);
       }
   }
       $status = fclose($handle);
   if ($retbytes && $status) {
       return $cnt; // return num. bytes delivered like readfile() does.
   }
   return $status;

} 


?>
